package com.SystemcurrentTimeMillis性能问题;

import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**最常见的办法是用单个调度线程来按毫秒更新时间戳，相当于维护一个全局缓存。其他线程取时间戳时相当于从内存取，不会再造成时钟资源的争用，代价就是牺牲了一些精确度。具体代码如下：
 * 使用的时候，直接 CurrentTimeMillisClock.getInstance().now()就可以了。
 * 不过，在System.currentTimeMillis()的效率没有影响程序整体的效率时，就完全没有必要做这种优化，这只是为极端情况准备的。
 * @author zhangsulei
 *
 */
public class CurrentTimeMillisClock {

	private volatile long now;

	private CurrentTimeMillisClock() {

		this.now = System.currentTimeMillis();

		scheduleTick();

	}

	private void scheduleTick() {

		new ScheduledThreadPoolExecutor(1, runnable -> {

			Thread thread = new Thread(runnable, "current-time-millis");

			thread.setDaemon(true);

			return thread;

		}).scheduleAtFixedRate(() -> {

			now = System.currentTimeMillis();

		}, 1, 1, TimeUnit.MILLISECONDS);

	}

	public long now() {

		return now;

	}

	public static CurrentTimeMillisClock getInstance() {

		return SingletonHolder.INSTANCE;

	}

	private static class SingletonHolder {

		private static final CurrentTimeMillisClock INSTANCE = new

		CurrentTimeMillisClock();

	}

}
